home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Linux / Kubuntu 8.10 / kubuntu-8.10-desktop-i386.iso / casper / filesystem.squashfs / usr / lib / python2.5 / cProfile.pyc (.txt) < prev    next >
Python Compiled Bytecode  |  2008-10-29  |  6KB  |  197 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.5)
  3.  
  4. """Python interface for the 'lsprof' profiler.
  5.    Compatible with the 'profile' module.
  6. """
  7. __all__ = [
  8.     'run',
  9.     'runctx',
  10.     'help',
  11.     'Profile']
  12. import _lsprof
  13.  
  14. def run(statement, filename = None, sort = -1):
  15.     '''Run statement under profiler optionally saving results in filename
  16.  
  17.     This function takes a single argument that can be passed to the
  18.     "exec" statement, and an optional file name.  In all cases this
  19.     routine attempts to "exec" its first argument and gather profiling
  20.     statistics from the execution. If no file name is present, then this
  21.     function automatically prints a simple profiling report, sorted by the
  22.     standard name string (file/line/function-name) that is presented in
  23.     each line.
  24.     '''
  25.     prof = Profile()
  26.     result = None
  27.     
  28.     try:
  29.         prof = prof.run(statement)
  30.     except SystemExit:
  31.         pass
  32.     finally:
  33.         if filename is not None:
  34.             prof.dump_stats(filename)
  35.         else:
  36.             result = prof.print_stats(sort)
  37.  
  38.     return result
  39.  
  40.  
  41. def runctx(statement, globals, locals, filename = None):
  42.     '''Run statement under profiler, supplying your own globals and locals,
  43.     optionally saving results in filename.
  44.  
  45.     statement and filename have the same semantics as profile.run
  46.     '''
  47.     prof = Profile()
  48.     result = None
  49.     
  50.     try:
  51.         prof = prof.runctx(statement, globals, locals)
  52.     except SystemExit:
  53.         pass
  54.     finally:
  55.         if filename is not None:
  56.             prof.dump_stats(filename)
  57.         else:
  58.             result = prof.print_stats()
  59.  
  60.     return result
  61.  
  62.  
  63. def help():
  64.     print 'Documentation for the profile/cProfile modules can be found '
  65.     print "in the Python Library Reference, section 'The Python Profiler'."
  66.  
  67.  
  68. class Profile(_lsprof.Profiler):
  69.     '''Profile(custom_timer=None, time_unit=None, subcalls=True, builtins=True)
  70.  
  71.     Builds a profiler object using the specified timer function.
  72.     The default timer is a fast built-in one based on real time.
  73.     For custom timer functions returning integers, time_unit can
  74.     be a float specifying a scale (i.e. how long each integer unit
  75.     is, in seconds).
  76.     '''
  77.     
  78.     def print_stats(self, sort = -1):
  79.         import pstats as pstats
  80.         pstats.Stats(self).strip_dirs().sort_stats(sort).print_stats()
  81.  
  82.     
  83.     def dump_stats(self, file):
  84.         import marshal as marshal
  85.         f = open(file, 'wb')
  86.         self.create_stats()
  87.         marshal.dump(self.stats, f)
  88.         f.close()
  89.  
  90.     
  91.     def create_stats(self):
  92.         self.disable()
  93.         self.snapshot_stats()
  94.  
  95.     
  96.     def snapshot_stats(self):
  97.         entries = self.getstats()
  98.         self.stats = { }
  99.         callersdicts = { }
  100.         for entry in entries:
  101.             func = label(entry.code)
  102.             nc = entry.callcount
  103.             cc = nc - entry.reccallcount
  104.             tt = entry.inlinetime
  105.             ct = entry.totaltime
  106.             callers = { }
  107.             callersdicts[id(entry.code)] = callers
  108.             self.stats[func] = (cc, nc, tt, ct, callers)
  109.         
  110.         for entry in entries:
  111.             if entry.calls:
  112.                 func = label(entry.code)
  113.                 for subentry in entry.calls:
  114.                     
  115.                     try:
  116.                         callers = callersdicts[id(subentry.code)]
  117.                     except KeyError:
  118.                         continue
  119.  
  120.                     nc = subentry.callcount
  121.                     cc = nc - subentry.reccallcount
  122.                     tt = subentry.inlinetime
  123.                     ct = subentry.totaltime
  124.                     if func in callers:
  125.                         prev = callers[func]
  126.                         nc += prev[0]
  127.                         cc += prev[1]
  128.                         tt += prev[2]
  129.                         ct += prev[3]
  130.                     
  131.                     callers[func] = (nc, cc, tt, ct)
  132.                 
  133.         
  134.  
  135.     
  136.     def run(self, cmd):
  137.         import __main__ as __main__
  138.         dict = __main__.__dict__
  139.         return self.runctx(cmd, dict, dict)
  140.  
  141.     
  142.     def runctx(self, cmd, globals, locals):
  143.         self.enable()
  144.         
  145.         try:
  146.             exec cmd in globals, locals
  147.         finally:
  148.             self.disable()
  149.  
  150.         return self
  151.  
  152.     
  153.     def runcall(self, func, *args, **kw):
  154.         self.enable()
  155.         
  156.         try:
  157.             return func(*args, **kw)
  158.         finally:
  159.             self.disable()
  160.  
  161.  
  162.  
  163.  
  164. def label(code):
  165.     if isinstance(code, str):
  166.         return ('~', 0, code)
  167.     else:
  168.         return (code.co_filename, code.co_firstlineno, code.co_name)
  169.  
  170.  
  171. def main():
  172.     import os as os
  173.     import sys as sys
  174.     OptionParser = OptionParser
  175.     import optparse
  176.     usage = 'cProfile.py [-o output_file_path] [-s sort] scriptfile [arg] ...'
  177.     parser = OptionParser(usage = usage)
  178.     parser.allow_interspersed_args = False
  179.     parser.add_option('-o', '--outfile', dest = 'outfile', help = 'Save stats to <outfile>', default = None)
  180.     parser.add_option('-s', '--sort', dest = 'sort', help = 'Sort order when printing to stdout, based on pstats.Stats class', default = -1)
  181.     if not sys.argv[1:]:
  182.         parser.print_usage()
  183.         sys.exit(2)
  184.     
  185.     (options, args) = parser.parse_args()
  186.     sys.argv[:] = args
  187.     if len(sys.argv) > 0:
  188.         sys.path.insert(0, os.path.dirname(sys.argv[0]))
  189.         run('execfile(%r)' % (sys.argv[0],), options.outfile, options.sort)
  190.     else:
  191.         parser.print_usage()
  192.     return parser
  193.  
  194. if __name__ == '__main__':
  195.     main()
  196.  
  197.